package site.ruolin.Operator;

import site.ruolin.KeyGen.Key.PublicKey;

import java.math.BigInteger;

/**
 * Paillier 同态运算器
 * @author ruolin on 2025/09/11
 */
public class Operator {
    private final PublicKey publicKey;

    /**
     * 构造函数
     * @param publicKey 公钥
     */
    public Operator(PublicKey publicKey) {
        this.publicKey = publicKey;
    }

    /**
     * 同态加法
     * 在密文状态下执行加法运算: E(m1) * E(m2) mod n^2 = E(m1 + m2)
     * @param ciphertext1 第一个密文
     * @param ciphertext2 第二个密文
     * @return 两个密文相乘的结果（对应明文相加的密文）
     */
    public BigInteger add(BigInteger ciphertext1, BigInteger ciphertext2) {
        return ciphertext1.multiply(ciphertext2).mod(publicKey.getNSquare());
    }

    /**
     * 同态数乘
     * 在密文状态下执行数乘运算: E(m)^k mod n^2 = E(k*m)
     * @param ciphertext 密文
     * @param constant 常数
     * @return 密文的常数次幂（对应明文的常数倍的密文）
     */
    public BigInteger multiply(BigInteger ciphertext, BigInteger constant) {
        return ciphertext.modPow(constant, publicKey.getNSquare());
    }
}
